package jp.co.dailyReport.total;

import java.sql.SQLException;
import org.apache.log4j.Logger;
import jp.co.dailyReport.ExecuterManager;
import jp.co.dailyReport.ConnectionFactory;
import jp.co.dailyReport.DataUnavailableException;
import jp.co.dailyReport.total.sql.TotalHoursWorkedProjectLoadExecuter;
import jp.co.dailyReport.total.sql.TotalHoursWorkedProjectCountExecuter;
import jp.co.dailyReport.total.sql.TotalHoursWorkedProjectTotalHoursExecuter;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.PermissionManager;

/**
 * プロジェクト毎稼働時間集計結果情報管理クラス
 */
public class TotalHoursWorkedProjectManager {

	private static Logger log = Logger.getLogger(TotalHoursWorkedProjectManager.class);

	/**
	 * プロジェクト毎稼働時間集計結果情報を取得します。
	 * 
	 * @param totalHoursWorkedProjectCondition プロジェクト毎稼働時間集計条件オブジェクト
	 * @return プロジェクト毎稼働時間集計結果オブジェクトの配列
	 * @throws DataUnavailableException
	 */
	public static TotalHoursWorkedProjectResult[] load(TotalHoursWorkedProjectCondition totalHoursWorkedProjectCondition) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		TotalHoursWorkedProjectLoadExecuter totalHoursWorkedProjectLoadExecuter = new TotalHoursWorkedProjectLoadExecuter(totalHoursWorkedProjectCondition);
		Object objs[] = (Object[])null;

		try {
			objs = ExecuterManager.execute(connectionFactory, totalHoursWorkedProjectLoadExecuter);
		} catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}

		if(objs == null || objs.length == 0) {
			return new TotalHoursWorkedProjectResult[0];
		} else {
			return (TotalHoursWorkedProjectResult[])objs;
		}
	}

	/**
	 * プロジェクト毎稼働時間集計結果件数を取得します。
	 * 
	 * @param totalHoursWorkedProjectCondition プロジェクト毎稼働時間集計条件オブジェクト
	 * @return プロジェクト毎稼働時間集計結果件数
	 * @throws DataUnavailableException
	 */
	public static int getTotalHoursWorkedProjectResultCount(TotalHoursWorkedProjectCondition totalHoursWorkedProjectCondition) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		TotalHoursWorkedProjectCountExecuter totalHoursWorkedProjectCountExecuter = new TotalHoursWorkedProjectCountExecuter(totalHoursWorkedProjectCondition);
		Object objs[] = null;

		try {
			objs = ExecuterManager.execute(connectionFactory, totalHoursWorkedProjectCountExecuter);
		} catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}

		if(objs == null || objs.length == 0) {
			return 0;
		} else {
			return ((Integer[])objs)[0].intValue();
		}
	}

	/**
	 * プロジェクト毎稼働時間集計合計時間を取得します。
	 * 
	 * @param totalHoursWorkedProjectCondition プロジェクト毎稼働時間集計条件オブジェクト
	 * @return プロジェクト毎稼働時間集計合計時間
	 * @throws DataUnavailableException
	 */
	public static double getTotalHoursWorkedProjectResultTotalHours(TotalHoursWorkedProjectCondition totalHoursWorkedProjectCondition) throws DataUnavailableException {

		ConnectionFactory connectionFactory = new ConnectionFactory();
		TotalHoursWorkedProjectTotalHoursExecuter totalHoursWorkedProjectTotalHoursExecuter = new TotalHoursWorkedProjectTotalHoursExecuter(totalHoursWorkedProjectCondition);
		Object objs[] = null;

		try {
			objs = ExecuterManager.execute(connectionFactory, totalHoursWorkedProjectTotalHoursExecuter);
		} catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}

		if(objs == null || objs.length == 0) {
			return 0;
		} else {
			return ((Double[])objs)[0].doubleValue();
		}
	}

	/**
	 * 社員の権限でプロジェクト毎稼働時間集計結果情報を取得します。
	 * 
	 * @param staff 社員オブジェクト
	 * @param totalHoursWorkedProjectCondition プロジェクト毎稼働時間集計条件オブジェクト
	 * @return プロジェクト毎稼働時間集計結果オブジェクトの配列
	 * @throws DataUnavailableException
	 */
	public static TotalHoursWorkedProjectResult[] load(Staff staff,TotalHoursWorkedProjectCondition totalHoursWorkedProjectCondition) throws DataUnavailableException {

		if(PermissionManager.hasPermission(staff,PermissionManager.HOURS_WORKEDFOREVERYPROJECT,PermissionManager.METHOD_READ)) {
			return load(totalHoursWorkedProjectCondition);
		}else{
			return new TotalHoursWorkedProjectResult[0];
		}
	}

	/**
	 * 社員の権限でプロジェクト毎稼働時間集計結果件数を取得します。
	 * 
	 * @param staff 社員オブジェクト
	 * @param totalHoursWorkedProjectCondition プロジェクト毎稼働時間集計条件オブジェクト
	 * @return プロジェクト毎稼働時間集計結果件数
	 * @throws DataUnavailableException
	 */
	public static int getTotalHoursWorkedProjectResultCount(Staff staff,TotalHoursWorkedProjectCondition totalHoursWorkedProjectCondition) 
	 throws DataUnavailableException {

		if(PermissionManager.hasPermission(staff,PermissionManager.HOURS_WORKEDFOREVERYPROJECT,PermissionManager.METHOD_READ)) {
			return getTotalHoursWorkedProjectResultCount(totalHoursWorkedProjectCondition);
		}else{
			return 0;
		}
	}

	/**
	 * 社員の権限でプロジェクト毎稼働時間集計合計時間を取得します。
	 * 
	 * @param staff 社員オブジェクト
	 * @param totalHoursWorkedProjectCondition プロジェクト毎稼働時間集計条件オブジェクト
	 * @return プロジェクト毎稼働時間集計合計時間
	 * @throws DataUnavailableException
	 */
	public static double getTotalHoursWorkedProjectResultTotalHours(Staff staff,TotalHoursWorkedProjectCondition totalHoursWorkedProjectCondition) 
	 throws DataUnavailableException {

		if(PermissionManager.hasPermission(staff,PermissionManager.HOURS_WORKEDFOREVERYPROJECT,PermissionManager.METHOD_READ)) {
			return getTotalHoursWorkedProjectResultTotalHours(totalHoursWorkedProjectCondition);
		}else{
			return 0;
		}
	}

	/**
	 * 合計稼働時間を取得します。
	 * 
	 * @param totalHoursWorkedProjectResult プロジェクト毎稼働時間集計結果オブジェクトの配列
	 * @return 合計稼働時間
	 * @throws DataUnavailableException
	 */
	public static double calculate(TotalHoursWorkedProjectResult[] totalHoursWorkedProjectResult) {

		double totalWorkingHours = 0;
		for(int i = 0; i < totalHoursWorkedProjectResult.length; i++) {
			totalWorkingHours += totalHoursWorkedProjectResult[i].getWorkingHours();
		}
		return totalWorkingHours;
	}
}
